#pragma once

#include <vector>
#include <string>

class Buffer {
public:
    explicit Buffer(size_t initialSize = 1024);

    size_t readableBytes() const;
    size_t writableBytes() const;
    size_t prependableBytes() const;

    const char* peek() const;
    void retrieve(size_t len);          // 取出部分数据
    void retrieveAll();                 // 全部取出
    std::string retrieveAllAsString();  // 取出并返回字符串

    void append(const char* data, size_t len);
    void append(const std::string& str);

    char* beginWrite();                 // 获取写入位置指针
    void hasWritten(size_t len);       // 写完 len 字节，更新 writeIndex

    void ensureWritableBytes(size_t len);  // 确保有足够空间写入
    void shrink(size_t reserve = 1024);   // 释放冗余空间

    // 从 fd 中读取数据进 buffer，返回字节数（封装 readv 支持多段写入）
    ssize_t readFd(int fd, int* savedErrno);

private:
    char* begin();
    const char* begin() const;

    void makeSpace(size_t len);

    std::vector<char> buffer_;
    size_t readerIndex_;
    size_t writerIndex_;
};
